package com.lzk.seckill.uitil;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * author: 刘中魁
 * 连接池获取redis
 */
public class JedisPoolUtil {

    // volatile 的作用
    //1.线程的可见性: 当一个线程去修改另一个共享变量时 另外一个线程可以读取这个修改的值
    //2.顺序的一致性: 禁止指令重排
    private static volatile JedisPool jedisPool = null;

    private JedisPoolUtil() {


    }

    //保证每次调用返回的 jedisPool 是单例
    public static JedisPool getJedisPoolInstance() {

        if (jedisPool == null) {
            synchronized (JedisPoolUtil.class) {
                //这里使用了双重校验
                if (null == jedisPool) {
                    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                    //对连接池进行配置
                    jedisPoolConfig.setMaxTotal(200);
                    jedisPoolConfig.setMaxIdle(32);
                    jedisPoolConfig.setMaxWaitMillis(60 * 1000);
                    jedisPoolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(jedisPoolConfig, "192.168.198.135", 6379, 60000);
                }
            }

        }


        return jedisPool;
    }
    //释放连接资源
    public static void release(Jedis jedis){
        if (null != null){
            jedis.close(); //如果jedis是从连接池获取的，这里的jedis.close()，就是把连接释放到连接池
        }
    }


}
